using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using InterfazGrafico.LibreriaConstantes;

namespace InterfazGrafico.LibreriaClases.Clases
{
    /// <summary>
    /// Gestiona un buffer de memoria.
    /// </summary>
    public class BufferMemoria
    {
        /// <summary>
        /// Stream de memoria que representa el buffer.
        /// </summary>
        private MemoryStream _buffer = null;

        /// <summary>
        /// Stream de memoria que representa el buffer.
        /// </summary>
        private MemoryStream Buffer
        {
            get
            {
                if (_buffer == null)
                    _buffer = new MemoryStream();
                return _buffer;
            }
        }

        /// <summary>
        /// Constructor.
        /// </summary>
        public BufferMemoria()
        {
        }

        /// <summary>
        /// Escribe el texto dentro del buffer.
        /// </summary>
        /// <param name="dato">Texto a escribir</param>
        public void Escribir(string dato)
        {
            try
            {
                char[] arrayChar = dato.ToCharArray();
                byte[] arrayByte = new byte[Encoding.Default.GetMaxByteCount(arrayChar.Length)];
                arrayByte = Encoding.Default.GetBytes(arrayChar);

                long posicionActual = this.Buffer.Length;
                this.Buffer.SetLength(posicionActual + arrayByte.Length);
                this.Buffer.Write(arrayByte, 0, arrayByte.Length);
            }
            catch (Exception)
            {
                throw new ApplicationException(Constantes.MensajeErrorEscribirBuffer);
            }
        }

        /// <summary>
        /// Obtiene el contenido del buffer.
        /// </summary>
        /// <returns>Contenido del buffer</returns>
        public string Leer()
        {
            try
            {
                byte[] arrayByte = new byte[this.Buffer.Length];
                this.Buffer.Seek(0, SeekOrigin.Begin);
                this.Buffer.Read(arrayByte, 0, (int)this.Buffer.Length);
                string datos = new string(Encoding.Default.GetChars(arrayByte));
                this.Buffer.Seek(0, SeekOrigin.Begin);
                this.Buffer.SetLength(0);
                return datos;
            }
            catch (Exception)
            {
                throw new ApplicationException(Constantes.MensajeErrorLeerBuffer);
            }
        }
    }
}
 